const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const { Server } = require('socket.io');

const dev = process.env.NODE_ENV !== 'production';
const hostname = 'localhost';
const port = 3000;

// 初始化Next.js
const app = next({ dev, hostname, port });
const handle = app.getRequestHandler();

// 房间用户记录
const projectUsers = new Map();

app.prepare().then(() => {
  // 创建HTTP服务器
  const server = createServer(async (req, res) => {
    try {
      const parsedUrl = parse(req.url, true);
      await handle(req, res, parsedUrl);
    } catch (err) {
      console.error('处理请求错误:', err);
      res.statusCode = 500;
      res.end('内部服务器错误');
    }
  });

  // 添加错误处理
  server.on('error', (err) => {
    console.error('服务器错误:', err);
  });

  // 初始化Socket.IO
  const io = new Server(server, {
    cors: {
      origin: "*",
      methods: ["GET", "POST"],
      credentials: true
    }
  });

  // Socket.IO连接处理
  io.on('connection', (socket) => {
    console.log('新客户端连接:', socket.id);
    
    // 用户信息
    let currentUser = {
      socketId: socket.id,
      projectId: null,
      name: 'Anonymous User',
      color: `#${Math.floor(Math.random()*16777215).toString(16)}`
    };

    // 加入项目房间
    socket.on('join-project', (data) => {
      const { projectId, userName } = data;
      currentUser.projectId = projectId;
      if (userName) currentUser.name = userName;
      
      console.log(`客户端 ${socket.id} (${currentUser.name}) 加入项目 ${projectId}`);
      
      // 加入房间
      socket.join(`project:${projectId}`);
      
      // 保存用户信息
      if (!projectUsers.has(projectId)) {
        projectUsers.set(projectId, new Map());
      }
      projectUsers.get(projectId).set(socket.id, currentUser);
      
      // 获取当前房间所有用户
      const roomUsers = Array.from(projectUsers.get(projectId).values());
      
      // 通知所有用户更新在线列表
      io.to(`project:${projectId}`).emit('users-update', roomUsers);
      
      // 通知房间中的其他用户
      socket.to(`project:${projectId}`).emit('user-joined', currentUser);
    });

    // 处理内容更新
    socket.on('content-update', (data) => {
      console.log(`收到内容更新，项目ID: ${data.projectId}，用户: ${currentUser.name}，内容长度: ${data.content?.length || 0}`);
      
      // 添加发送者信息
      const enhancedData = {
        ...data,
        sender: {
          socketId: socket.id,
          name: currentUser.name,
          color: currentUser.color
        }
      };
      
      // 获取房间信息
      const room = `project:${data.projectId}`;
      const roomSize = io.sockets.adapter.rooms.get(room)?.size || 0;
      console.log(`广播更新到房间: ${room}，房间内成员数量: ${roomSize}`);
      
      // 广播给项目中的所有用户，包括发送者
      io.to(room).emit('content-update', enhancedData);
    });

    // 处理光标位置更新
    socket.on('cursor-update', (data) => {
      // 添加用户信息
      const enhancedData = {
        ...data,
        user: currentUser
      };
      
      // 广播到房间内的其他用户
      socket.to(`project:${data.projectId}`).emit('cursor-update', enhancedData);
    });

    // 处理断开连接
    socket.on('disconnect', () => {
      console.log('客户端断开连接:', socket.id);
      
      // 如果用户在某个项目中，从项目中移除并通知其他用户
      if (currentUser.projectId) {
        const projectId = currentUser.projectId;
        if (projectUsers.has(projectId)) {
          projectUsers.get(projectId).delete(socket.id);
          
          // 获取更新后的用户列表
          const roomUsers = Array.from(projectUsers.get(projectId).values());
          
          // 通知其他用户
          io.to(`project:${projectId}`).emit('users-update', roomUsers);
          io.to(`project:${projectId}`).emit('user-left', currentUser);
        }
      }
    });
  });

  // 启动服务器
  server.listen(port, hostname, (err) => {
    if (err) throw err;
    console.log(`> 服务器已在 http://${hostname}:${port} 启动`);
    console.log('> Socket.IO 已初始化');
  });
}).catch(err => {
  console.error('准备Next.js时出错:', err);
  process.exit(1);
});